home *** CD-ROM | disk | FTP | other *** search
/ PC/CD Gamer UK 120 / CD Gamer Issue 120 (March 2003) (Disc 2).ISO / mods / Q2_Codered / codeRED1_0.exe / Data1.cab / m_insane.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-12-07  |  17.5 KB  |  694 lines

  1. /*
  2. Copyright (C) 1997-2001 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. /*
  21. ==============================================================================
  22.  
  23. insane
  24.  
  25. ==============================================================================
  26. */
  27.  
  28. #include "g_local.h"
  29. #include "m_insane.h"
  30.  
  31.  
  32. static int    sound_fist;
  33. static int    sound_shake;
  34. static int    sound_moan;
  35. static int    sound_scream[8];
  36.  
  37. void insane_fist (edict_t *self)
  38. {
  39.     gi.sound (self, CHAN_VOICE, sound_fist, 1, ATTN_IDLE, 0);
  40. }
  41.  
  42. void insane_shake (edict_t *self)
  43. {
  44.     gi.sound (self, CHAN_VOICE, sound_shake, 1, ATTN_IDLE, 0);
  45. }
  46.  
  47. void insane_moan (edict_t *self)
  48. {
  49.     gi.sound (self, CHAN_VOICE, sound_moan, 1, ATTN_IDLE, 0);
  50. }
  51.  
  52. void insane_scream (edict_t *self)
  53. {
  54.     gi.sound (self, CHAN_VOICE, sound_scream[rand()%8], 1, ATTN_IDLE, 0);
  55. }
  56.  
  57.  
  58. void insane_stand (edict_t *self);
  59. void insane_dead (edict_t *self);
  60. void insane_cross (edict_t *self);
  61. void insane_walk (edict_t *self);
  62. void insane_run (edict_t *self);
  63. void insane_checkdown (edict_t *self);
  64. void insane_checkup (edict_t *self);
  65. void insane_onground (edict_t *self);
  66.  
  67.  
  68. mframe_t insane_frames_stand_normal [] =
  69. {
  70.     ai_stand, 0, NULL,
  71.     ai_stand, 0, NULL,
  72.     ai_stand, 0, NULL,
  73.     ai_stand, 0, NULL,
  74.     ai_stand, 0, NULL,
  75.     ai_stand, 0, insane_checkdown
  76. };
  77. mmove_t insane_move_stand_normal = {FRAME_stand60, FRAME_stand65, insane_frames_stand_normal, insane_stand};
  78.  
  79. mframe_t insane_frames_stand_insane [] =
  80. {
  81.     ai_stand,    0,    insane_shake,
  82.     ai_stand,    0,    NULL,
  83.     ai_stand,    0,    NULL,
  84.     ai_stand,    0,    NULL,
  85.     ai_stand,    0,    NULL,
  86.     ai_stand,    0,    NULL,
  87.     ai_stand,    0,    NULL,
  88.     ai_stand,    0,    NULL,
  89.     ai_stand,    0,    NULL,
  90.     ai_stand,    0,    NULL,
  91.     ai_stand,    0,    NULL,
  92.     ai_stand,    0,    NULL,
  93.     ai_stand,    0,    NULL,
  94.     ai_stand,    0,    NULL,
  95.     ai_stand,    0,    NULL,
  96.     ai_stand,    0,    NULL,
  97.     ai_stand,    0,    NULL,
  98.     ai_stand,    0,    NULL,
  99.     ai_stand,    0,    NULL,
  100.     ai_stand,    0,    NULL,
  101.     ai_stand,    0,    NULL,
  102.     ai_stand,    0,    NULL,
  103.     ai_stand,    0,    NULL,
  104.     ai_stand,    0,    NULL,
  105.     ai_stand,    0,    NULL,
  106.     ai_stand,    0,    NULL,
  107.     ai_stand,    0,    NULL,
  108.     ai_stand,    0,    NULL,
  109.     ai_stand,    0,    NULL,
  110.     ai_stand,    0,    insane_checkdown
  111. };
  112. mmove_t insane_move_stand_insane = {FRAME_stand65, FRAME_stand94, insane_frames_stand_insane, insane_stand};
  113.  
  114. mframe_t insane_frames_uptodown [] =
  115. {
  116.     ai_move,    0,    NULL,
  117.     ai_move,    0,    NULL,
  118.     ai_move,    0,    NULL,
  119.     ai_move,    0,    NULL,
  120.     ai_move,    0,    NULL,
  121.     ai_move,    0,    NULL,
  122.     ai_move,    0,    NULL,
  123.     ai_move,    0,    insane_moan,
  124.     ai_move,    0,    NULL,
  125.     ai_move,    0,    NULL,
  126.  
  127.     ai_move,    0,    NULL,
  128.     ai_move,    0,    NULL,
  129.     ai_move,    0,    NULL,
  130.     ai_move,    0,    NULL,
  131.     ai_move,    0,    NULL,
  132.     ai_move,    0,    NULL,
  133.     ai_move,    0,    NULL,
  134.     ai_move,    0,    NULL,
  135.     ai_move,    0,    NULL,
  136.     ai_move,    0,    NULL,
  137.  
  138.     ai_move,    2.7,    NULL,
  139.     ai_move,    4.1,    NULL,
  140.     ai_move,    6,        NULL,
  141.     ai_move,    7.6,    NULL,
  142.     ai_move,    3.6,    NULL,
  143.     ai_move,    0,    NULL,
  144.     ai_move,    0,    NULL,
  145.     ai_move,    0,    insane_fist,
  146.     ai_move,    0,    NULL,
  147.     ai_move,    0,    NULL,
  148.  
  149.     ai_move,    0,    NULL,
  150.     ai_move,    0,    NULL,
  151.     ai_move,    0,    NULL,
  152.     ai_move,    0,    insane_fist,
  153.     ai_move,    0,    NULL,
  154.     ai_move,    0,    NULL,
  155.     ai_move,    0,    NULL,
  156.     ai_move,    0,    NULL,
  157.     ai_move,    0,    NULL,
  158.     ai_move,    0,    NULL
  159. };
  160. mmove_t insane_move_uptodown = {FRAME_stand1, FRAME_stand40, insane_frames_uptodown, insane_onground};
  161.  
  162.  
  163. mframe_t insane_frames_downtoup [] =
  164. {
  165.     ai_move,    -0.7,    NULL,            // 41
  166.     ai_move,    -1.2,    NULL,            // 42
  167.     ai_move,    -1.5,        NULL,        // 43
  168.     ai_move,    -4.5,        NULL,        // 44
  169.     ai_move,    -3.5,    NULL,            // 45
  170.     ai_move,    -0.2,    NULL,            // 46
  171.     ai_move,    0,    NULL,            // 47
  172.     ai_move,    -1.3,    NULL,            // 48
  173.     ai_move,    -3,    NULL,                // 49
  174.     ai_move,    -2,    NULL,            // 50
  175.     ai_move,    0,    NULL,                // 51
  176.     ai_move,    0,    NULL,                // 52
  177.     ai_move,    0,    NULL,                // 53
  178.     ai_move,    -3.3,    NULL,            // 54
  179.     ai_move,    -1.6,    NULL,            // 55
  180.     ai_move,    -0.3,    NULL,            // 56
  181.     ai_move,    0,    NULL,                // 57
  182.     ai_move,    0,    NULL,                // 58
  183.     ai_move,    0,    NULL                // 59
  184. };
  185. mmove_t insane_move_downtoup = {FRAME_stand41, FRAME_stand59, insane_frames_downtoup, insane_stand};
  186.  
  187. mframe_t insane_frames_jumpdown [] =
  188. {
  189.     ai_move,    0.2,    NULL,
  190.     ai_move,    11.5,    NULL,
  191.     ai_move,    5.1,    NULL,
  192.     ai_move,    7.1,    NULL,
  193.     ai_move,    0,    NULL
  194. };
  195. mmove_t insane_move_jumpdown = {FRAME_stand96, FRAME_stand100, insane_frames_jumpdown, insane_onground};
  196.  
  197.  
  198. mframe_t insane_frames_down [] =
  199. {
  200.     ai_move,    0,        NULL,        // 100
  201.     ai_move,    0,        NULL,
  202.     ai_move,    0,        NULL,
  203.     ai_move,    0,        NULL,
  204.     ai_move,    0,        NULL,
  205.     ai_move,    0,        NULL,
  206.     ai_move,    0,        NULL,
  207.     ai_move,    0,        NULL,
  208.     ai_move,    0,        NULL,
  209.     ai_move,    0,        NULL,
  210.     ai_move,    0,        NULL,        // 110
  211.     ai_move,    -1.7,        NULL,
  212.     ai_move,    -1.6,        NULL,
  213.     ai_move,    0,        NULL,
  214.     ai_move,    0,        NULL,
  215.     ai_move,    0,        NULL,
  216.     ai_move,    0,        insane_fist,
  217.     ai_move,    0,        NULL,
  218.     ai_move,    0,        NULL,
  219.     ai_move,    0,        NULL,
  220.     ai_move,    0,        NULL,        // 120
  221.     ai_move,    0,        NULL,
  222.     ai_move,    0,        NULL,
  223.     ai_move,    0,        NULL,
  224.     ai_move,    0,        NULL,
  225.     ai_move,    0,        NULL,
  226.     ai_move,    0,        NULL,
  227.     ai_move,    0,        NULL,
  228.     ai_move,    0,        NULL,
  229.     ai_move,    0,        NULL,
  230.     ai_move,    0,        NULL,        // 130
  231.     ai_move,    0,        NULL,
  232.     ai_move,    0,        NULL,
  233.     ai_move,    0,        insane_moan,
  234.     ai_move,    0,        NULL,
  235.     ai_move,    0,        NULL,
  236.     ai_move,    0,        NULL,
  237.     ai_move,    0,        NULL,
  238.     ai_move,    0,        NULL,
  239.     ai_move,    0,        NULL,
  240.     ai_move,    0,        NULL,        // 140
  241.     ai_move,    0,        NULL,
  242.     ai_move,    0,        NULL,
  243.     ai_move,    0,        NULL,
  244.     ai_move,    0,        NULL,
  245.     ai_move,    0,        NULL,
  246.     ai_move,    0,        NULL,
  247.     ai_move,    0,        NULL,
  248.     ai_move,    0,        NULL,
  249.     ai_move,    0,        NULL,
  250.     ai_move,    0,        NULL,        // 150
  251.     ai_move,    0.5,        NULL,
  252.     ai_move,    0,        NULL,
  253.     ai_move,    -0.2,        insane_scream,
  254.     ai_move,    0,        NULL,
  255.     ai_move,    0.2,        NULL,
  256.     ai_move,    0.4,        NULL,
  257.     ai_move,    0.6,        NULL,
  258.     ai_move,    0.8,        NULL,
  259.     ai_move,    0.7,        NULL,
  260.     ai_move,    0,        insane_checkup        // 160
  261. };
  262. mmove_t insane_move_down = {FRAME_stand100, FRAME_stand160, insane_frames_down, insane_onground};
  263.  
  264. mframe_t insane_frames_walk_normal [] =
  265. {
  266.     ai_walk,    0,        insane_scream,
  267.     ai_walk,    2.5,    NULL,
  268.     ai_walk,    3.5,    NULL,
  269.     ai_walk,    1.7,    NULL,
  270.     ai_walk,    2.3,    NULL,
  271.     ai_walk,    2.4,    NULL,
  272.     ai_walk,    2.2,    NULL,
  273.     ai_walk,    4.2,    NULL,
  274.     ai_walk,    5.6,    NULL,
  275.     ai_walk,    3.3,    NULL,
  276.     ai_walk,    2.4,    NULL,
  277.     ai_walk,    0.9,    NULL,
  278.     ai_walk,    0,        NULL
  279. };
  280. mmove_t insane_move_walk_normal = {FRAME_walk27, FRAME_walk39, insane_frames_walk_normal, insane_walk};
  281. mmove_t insane_move_run_normal = {FRAME_walk27, FRAME_walk39, insane_frames_walk_normal, insane_run};
  282.  
  283. mframe_t insane_frames_walk_insane [] =
  284. {
  285.     ai_walk,    0,        insane_scream,        // walk 1
  286.     ai_walk,    3.4,    NULL,        // walk 2
  287.     ai_walk,    3.6,    NULL,        // 3
  288.     ai_walk,    2.9,    NULL,        // 4
  289.     ai_walk,    2.2,    NULL,        // 5
  290.     ai_walk,    2.6,    NULL,        // 6
  291.     ai_walk,    0,        NULL,        // 7
  292.     ai_walk,    0.7,    NULL,        // 8
  293.     ai_walk,    4.8,    NULL,        // 9
  294.     ai_walk,    5.3,    NULL,        // 10
  295.     ai_walk,    1.1,    NULL,        // 11
  296.     ai_walk,    2,        NULL,        // 12
  297.     ai_walk,    0.5,    NULL,        // 13
  298.     ai_walk,    0,        NULL,        // 14
  299.     ai_walk,    0,        NULL,        // 15
  300.     ai_walk,    4.9,    NULL,        // 16
  301.     ai_walk,    6.7,    NULL,        // 17
  302.     ai_walk,    3.8,    NULL,        // 18
  303.     ai_walk,    2,        NULL,        // 19
  304.     ai_walk,    0.2,    NULL,        // 20
  305.     ai_walk,    0,        NULL,        // 21
  306.     ai_walk,    3.4,    NULL,        // 22
  307.     ai_walk,    6.4,    NULL,        // 23
  308.     ai_walk,    5,        NULL,        // 24
  309.     ai_walk,    1.8,    NULL,        // 25
  310.     ai_walk,    0,        NULL        // 26
  311. };
  312. mmove_t insane_move_walk_insane = {FRAME_walk1, FRAME_walk26, insane_frames_walk_insane, insane_walk};
  313. mmove_t insane_move_run_insane = {FRAME_walk1, FRAME_walk26, insane_frames_walk_insane, insane_run};
  314.  
  315. mframe_t insane_frames_stand_pain [] =
  316. {
  317.     ai_move,    0,        NULL,
  318.     ai_move,    0,        NULL,
  319.     ai_move,    0,        NULL,
  320.     ai_move,    0,        NULL,
  321.     ai_move,    0,        NULL,
  322.     ai_move,    0,        NULL,
  323.     ai_move,    0,        NULL,
  324.     ai_move,    0,        NULL,
  325.     ai_move,    0,        NULL,
  326.     ai_move,    0,        NULL,
  327.     ai_move,    0,        NULL
  328. };
  329. mmove_t insane_move_stand_pain = {FRAME_st_pain2, FRAME_st_pain12, insane_frames_stand_pain, insane_run};
  330.  
  331. mframe_t insane_frames_stand_death [] =
  332. {
  333.     ai_move,    0,        NULL,
  334.     ai_move,    0,        NULL,
  335.     ai_move,    0,        NULL,
  336.     ai_move,    0,        NULL,
  337.     ai_move,    0,        NULL,
  338.     ai_move,    0,        NULL,
  339.     ai_move,    0,        NULL,
  340.     ai_move,    0,        NULL,
  341.     ai_move,    0,        NULL,
  342.     ai_move,    0,        NULL,
  343.     ai_move,    0,        NULL,
  344.     ai_move,    0,        NULL,
  345.     ai_move,    0,        NULL,
  346.     ai_move,    0,        NULL,
  347.     ai_move,    0,        NULL,
  348.     ai_move,    0,        NULL,
  349.     ai_move,    0,        NULL
  350. };
  351. mmove_t insane_move_stand_death = {FRAME_st_death2, FRAME_st_death18, insane_frames_stand_death, insane_dead};
  352.  
  353. mframe_t insane_frames_crawl [] =
  354. {
  355.     ai_walk,    0,        insane_scream,
  356.     ai_walk,    1.5,    NULL,
  357.     ai_walk,    2.1,    NULL,
  358.     ai_walk,    3.6,    NULL,
  359.     ai_walk,    2,        NULL,
  360.     ai_walk,    0.9,    NULL,
  361.     ai_walk,    3,        NULL,
  362.     ai_walk,    3.4,    NULL,
  363.     ai_walk,    2.4,    NULL
  364. };
  365. mmove_t insane_move_crawl = {FRAME_crawl1, FRAME_crawl9, insane_frames_crawl, NULL};
  366. mmove_t insane_move_runcrawl = {FRAME_crawl1, FRAME_crawl9, insane_frames_crawl, NULL};
  367.  
  368. mframe_t insane_frames_crawl_pain [] =
  369. {
  370.     ai_move,    0,        NULL,
  371.     ai_move,    0,        NULL,
  372.     ai_move,    0,        NULL,
  373.     ai_move,    0,        NULL,
  374.     ai_move,    0,        NULL,
  375.     ai_move,    0,        NULL,
  376.     ai_move,    0,        NULL,
  377.     ai_move,    0,        NULL,
  378.     ai_move,    0,        NULL
  379. };
  380. mmove_t insane_move_crawl_pain = {FRAME_cr_pain2, FRAME_cr_pain10, insane_frames_crawl_pain, insane_run};
  381.  
  382. mframe_t insane_frames_crawl_death [] =
  383. {
  384.     ai_move,    0,        NULL,
  385.     ai_move,    0,        NULL,
  386.     ai_move,    0,        NULL,
  387.     ai_move,    0,        NULL,
  388.     ai_move,    0,        NULL,
  389.     ai_move,    0,        NULL,
  390.     ai_move,    0,        NULL
  391. };
  392. mmove_t insane_move_crawl_death = {FRAME_cr_death10, FRAME_cr_death16, insane_frames_crawl_death, insane_dead};
  393.  
  394. mframe_t insane_frames_cross [] =
  395. {
  396.     ai_move,    0,        insane_moan,
  397.     ai_move,    0,        NULL,
  398.     ai_move,    0,        NULL,
  399.     ai_move,    0,        NULL,
  400.     ai_move,    0,        NULL,
  401.     ai_move,    0,        NULL,
  402.     ai_move,    0,        NULL,
  403.     ai_move,    0,        NULL,
  404.     ai_move,    0,        NULL,
  405.     ai_move,    0,        NULL,
  406.     ai_move,    0,        NULL,
  407.     ai_move,    0,        NULL,
  408.     ai_move,    0,        NULL,
  409.     ai_move,    0,        NULL,
  410.     ai_move,    0,        NULL
  411. };
  412. mmove_t insane_move_cross = {FRAME_cross1, FRAME_cross15, insane_frames_cross, insane_cross};
  413.  
  414. mframe_t insane_frames_struggle_cross [] =
  415. {
  416.     ai_move,    0,        insane_scream,
  417.     ai_move,    0,        NULL,
  418.     ai_move,    0,        NULL,
  419.     ai_move,    0,        NULL,
  420.     ai_move,    0,        NULL,
  421.     ai_move,    0,        NULL,
  422.     ai_move,    0,        NULL,
  423.     ai_move,    0,        NULL,
  424.     ai_move,    0,        NULL,
  425.     ai_move,    0,        NULL,
  426.     ai_move,    0,        NULL,
  427.     ai_move,    0,        NULL,
  428.     ai_move,    0,        NULL,
  429.     ai_move,    0,        NULL,
  430.     ai_move,    0,        NULL
  431. };
  432. mmove_t insane_move_struggle_cross = {FRAME_cross16, FRAME_cross30, insane_frames_struggle_cross, insane_cross};
  433.  
  434. void insane_cross (edict_t *self)
  435. {
  436.     if (random() < 0.8)        
  437.         self->monsterinfo.currentmove = &insane_move_cross;
  438.     else
  439.         self->monsterinfo.currentmove = &insane_move_struggle_cross;
  440. }
  441.  
  442. void insane_walk (edict_t *self)
  443. {
  444.     if ( self->spawnflags & 16 )            // Hold Ground?
  445.         if (self->s.frame == FRAME_cr_pain10)
  446.         {
  447.             self->monsterinfo.currentmove = &insane_move_down;
  448.             return;
  449.         }
  450.     if (self->spawnflags & 4)
  451.         self->monsterinfo.currentmove = &insane_move_crawl;
  452.     else
  453.         if (random() <= 0.5)
  454.             self->monsterinfo.currentmove = &insane_move_walk_normal;
  455.         else
  456.             self->monsterinfo.currentmove = &insane_move_walk_insane;
  457. }
  458.  
  459. void insane_run (edict_t *self)
  460. {
  461.     if ( self->spawnflags & 16 )            // Hold Ground?
  462.         if (self->s.frame == FRAME_cr_pain10)
  463.         {
  464.             self->monsterinfo.currentmove = &insane_move_down;
  465.             return;
  466.         }
  467.     if (self->spawnflags & 4)                // Crawling?
  468.         self->monsterinfo.currentmove = &insane_move_runcrawl;
  469.     else
  470.         if (random() <= 0.5)                // Else, mix it up
  471.             self->monsterinfo.currentmove = &insane_move_run_normal;
  472.         else
  473.             self->monsterinfo.currentmove = &insane_move_run_insane;
  474. }
  475.  
  476.  
  477. void insane_pain (edict_t *self, edict_t *other, float kick, int damage)
  478. {
  479.     int    l,r;
  480.  
  481. //    if (self->health < (self->max_health / 2))
  482. //        self->s.skinnum = 1;
  483.  
  484.     if (level.time < self->pain_debounce_time)
  485.         return;
  486.  
  487.     self->pain_debounce_time = level.time + 3;
  488.  
  489.     r = 1 + (rand()&1);
  490.     if (self->health < 25)
  491.         l = 25;
  492.     else if (self->health < 50)
  493.         l = 50;
  494.     else if (self->health < 75)
  495.         l = 75;
  496.     else
  497.         l = 100;
  498.     gi.sound (self, CHAN_VOICE, gi.soundindex (va("player/male/pain%i_%i.wav", l, r)), 1, ATTN_IDLE, 0);
  499.  
  500.     if (skill->value == 3)
  501.         return;        // no pain anims in nightmare
  502.  
  503.     // Don't go into pain frames if crucified.
  504.     if (self->spawnflags & 8)
  505.     {
  506.         self->monsterinfo.currentmove = &insane_move_struggle_cross;            
  507.         return;
  508.     }
  509.     
  510.     if  ( ((self->s.frame >= FRAME_crawl1) && (self->s.frame <= FRAME_crawl9)) || ((self->s.frame >= FRAME_stand99) && (self->s.frame <= FRAME_stand160)) )
  511.     {
  512.         self->monsterinfo.currentmove = &insane_move_crawl_pain;
  513.     }
  514.     else
  515.         self->monsterinfo.currentmove = &insane_move_stand_pain;
  516.  
  517. }
  518.  
  519. void insane_onground (edict_t *self)
  520. {
  521.     self->monsterinfo.currentmove = &insane_move_down;
  522. }
  523.  
  524. void insane_checkdown (edict_t *self)
  525. {
  526. //    if ( (self->s.frame == FRAME_stand94) || (self->s.frame == FRAME_stand65) )
  527.     if (self->spawnflags & 32)                // Always stand
  528.         return;
  529.     if (random() < 0.3)
  530.         if (random() < 0.5)
  531.             self->monsterinfo.currentmove = &insane_move_uptodown;
  532.         else
  533.             self->monsterinfo.currentmove = &insane_move_jumpdown; 
  534. }
  535.  
  536. void insane_checkup (edict_t *self)
  537. {
  538.     // If Hold_Ground and Crawl are set
  539.     if ( (self->spawnflags & 4) && (self->spawnflags & 16) )
  540.         return;
  541.     if (random() < 0.5)
  542.         self->monsterinfo.currentmove = &insane_move_downtoup;                
  543.  
  544. }
  545.  
  546. void insane_stand (edict_t *self)
  547. {
  548.     if (self->spawnflags & 8)            // If crucified
  549.     {
  550.         self->monsterinfo.currentmove = &insane_move_cross;
  551.         self->monsterinfo.aiflags |= AI_STAND_GROUND;
  552.     }
  553.     // If Hold_Ground and Crawl are set
  554.     else if ( (self->spawnflags & 4) && (self->spawnflags & 16) )
  555.         self->monsterinfo.currentmove = &insane_move_down;
  556.     else
  557.         if (random() < 0.5)
  558.             self->monsterinfo.currentmove = &insane_move_stand_normal;
  559.         else
  560.             self->monsterinfo.currentmove = &insane_move_stand_insane;
  561. }
  562.  
  563. void insane_dead (edict_t *self)
  564. {
  565.     if (self->spawnflags & 8)
  566.     {
  567.         self->flags |= FL_FLY;
  568.     }
  569.     else
  570.     {
  571.         VectorSet (self->mins, -16, -16, -24);
  572.         VectorSet (self->maxs, 16, 16, -8);
  573.         self->movetype = MOVETYPE_TOSS;
  574.     }
  575.     self->svflags |= SVF_DEADMONSTER;
  576.     self->nextthink = 0;
  577.     gi.linkentity (self);
  578. }
  579.  
  580.  
  581. void insane_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
  582. {
  583.     int        n;
  584.  
  585.     if (self->health <= self->gib_health)
  586.     {
  587.         gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_IDLE, 0);
  588.         for (n= 0; n < 2; n++)
  589.             ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC, EF_GIB);
  590.         for (n= 0; n < 4; n++)
  591.             ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC, EF_GIB);
  592.         ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC, EF_GIB);
  593.         self->deadflag = DEAD_DEAD;
  594.         return;
  595.     }
  596.  
  597.     if (self->deadflag == DEAD_DEAD)
  598.         return;
  599.  
  600.     gi.sound (self, CHAN_VOICE, gi.soundindex(va("player/male/death%i.wav", (rand()%4)+1)), 1, ATTN_IDLE, 0);
  601.  
  602.     self->deadflag = DEAD_DEAD;
  603.     self->takedamage = DAMAGE_YES;
  604.  
  605.     if (self->spawnflags & 8)
  606.     {
  607.         insane_dead (self);
  608.     }
  609.     else
  610.     {
  611.         if ( ((self->s.frame >= FRAME_crawl1) && (self->s.frame <= FRAME_crawl9)) || ((self->s.frame >= FRAME_stand99) && (self->s.frame <= FRAME_stand160)) )        
  612.             self->monsterinfo.currentmove = &insane_move_crawl_death;
  613.         else
  614.             self->monsterinfo.currentmove = &insane_move_stand_death;
  615.     }
  616. }
  617.  
  618.  
  619. /*QUAKED misc_insane (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn CRAWL CRUCIFIED STAND_GROUND ALWAYS_STAND
  620. */
  621. void SP_misc_insane (edict_t *self)
  622. {
  623. //    static int skin = 0;    //@@
  624.  
  625.     if (deathmatch->value)
  626.     {
  627.         G_FreeEdict (self);
  628.         return;
  629.     }
  630.  
  631.     sound_fist = gi.soundindex ("insane/insane11.wav");
  632.     sound_shake = gi.soundindex ("insane/insane5.wav");
  633.     sound_moan = gi.soundindex ("insane/insane7.wav");
  634.     sound_scream[0] = gi.soundindex ("insane/insane1.wav");
  635.     sound_scream[1] = gi.soundindex ("insane/insane2.wav");
  636.     sound_scream[2] = gi.soundindex ("insane/insane3.wav");
  637.     sound_scream[3] = gi.soundindex ("insane/insane4.wav");
  638.     sound_scream[4] = gi.soundindex ("insane/insane6.wav");
  639.     sound_scream[5] = gi.soundindex ("insane/insane8.wav");
  640.     sound_scream[6] = gi.soundindex ("insane/insane9.wav");
  641.     sound_scream[7] = gi.soundindex ("insane/insane10.wav");
  642.  
  643.     self->movetype = MOVETYPE_STEP;
  644.     self->solid = SOLID_BBOX;
  645.     self->s.modelindex = gi.modelindex("models/monsters/insane/tris.md2");
  646.  
  647.     VectorSet (self->mins, -16, -16, -24);
  648.     VectorSet (self->maxs, 16, 16, 32);
  649.  
  650.     self->health = 100;
  651.     self->gib_health = -50;
  652.     self->mass = 300;
  653.  
  654.     self->pain = insane_pain;
  655.     self->die = insane_die;
  656.  
  657.     self->monsterinfo.stand = insane_stand;
  658.     self->monsterinfo.walk = insane_walk;
  659.     self->monsterinfo.run = insane_run;
  660.     self->monsterinfo.dodge = NULL;
  661.     self->monsterinfo.attack = NULL;
  662.     self->monsterinfo.melee = NULL;
  663.     self->monsterinfo.sight = NULL;
  664.     self->monsterinfo.aiflags |= AI_GOOD_GUY;
  665.  
  666. //@@
  667. //    self->s.skinnum = skin;
  668. //    skin++;
  669. //    if (skin > 12)
  670. //        skin = 0;
  671.  
  672.     gi.linkentity (self);
  673.  
  674.     if (self->spawnflags & 16)                // Stand Ground
  675.         self->monsterinfo.aiflags |= AI_STAND_GROUND;
  676.  
  677.     self->monsterinfo.currentmove = &insane_move_stand_normal;
  678.     
  679.     self->monsterinfo.scale = MODEL_SCALE;
  680.  
  681.     if (self->spawnflags & 8)                    // Crucified ?
  682.     {
  683.         VectorSet (self->mins, -16, 0, 0);
  684.         VectorSet (self->maxs, 16, 8, 32);
  685.         self->flags |= FL_NO_KNOCKBACK;
  686.         flymonster_start (self);
  687.     }
  688.     else
  689.     {
  690.         walkmonster_start (self);
  691.         self->s.skinnum = rand()%3;
  692.     }
  693. }
  694.